Dynamic allocation
Dynamische Allokation von Speicher ist ein sehr wichtiges Thema in C - es erlaubt komplexe Datenstrukturen zu erstellen, wie bspw. gelinkte Listen. Speicher dynamisch zu belegen hilft uns dabei Daten zu speichern, ohne vorher wissen zu müssen, wie groß die Daten werden können.
Um ein Stück Speicher dynamisch zu belegen, müssen wir einen Zeiger bereit halten, welcher den Ort des neu belegten Speicher beinhaltet. Wir können den Speicher, der für uns reserviert wurde, mit diesem Zeiger erreichen und wir können den Zeiger benutzen, um den Speicher wieder freizugeben, sobald wir mit ihm fertig sind.
Nehmen wir an wir wollen eine Personen Struktur dynamisch belegen. Sie Person ist folgendermaßen definiert:
typedef struct {
char * name;
char age;
} person;
Um eine neue Person im myperson
Argument anzulegen, benutzen wir die folgende Syntax:
person * myperson = malloc(sizeof(person));
Das lässt den Compiler wissen, dass wir gerade genug Speicher belegen wollen, um eine Person Struktur zu halten und das er einen Pointer zu dem neu angelegten Speicher zurückgeben soll.
Beachte, dass sizeof
keine wirkliche Funktion ist. Der Compiler interpretiert es und übersetzt es in die tatsächliche Größe des Zeiger Structs.
Um auf die Variablen einer Person zu zugreifen, können wir die ->
Notation benutzen:
myperson->name = "John";
myperson->age = 27;
Wenn wir mit dem dynamisch angelegten Strukt fertig sind, können wir es mit free
freigeben:
free(myperson);
Beachte, dass free
die myperson
Variable nicht löscht. Es gibt lediglich den Speicher, auf den der Zeiger myperson
zeigt frei, allerdings zeigt er immer noch auf eine Speicheradresse. Allerdings dürfen wir nicht mehr darauf zugreifen, nachdem wir ihn freigegeben haben. Das ist eine große Fehlerquelle.
Übung
Benutze malloc
um eine point
Struktur dynamisch zu belegen.
Use malloc
to dynamically allocate a point structure.